package com.wmx.cglibapp.beans;

import com.wmx.cglibapp.pojo.User;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.core.AbstractClassGenerator;
import org.junit.Test;

import java.time.LocalDateTime;

/**
 * BeanMap 实现了 Map 接口，将 java bean 的所有属性转换为 String - Object 型的 Java Map 对象。
 * java bean 的属性需要提供 getter、setter 方法。转换之后，对 BeanMap 与 java bean 的修改，都会影响彼此。
 *
 * @author wangmaoxiong
 * @version 1.0
 * @date 2020/4/18 21:29
 */
public class BeanMapTest {

    /**
     * BeanMap create(Object bean)：通过 Java bean 创建 BeanMap 对象
     * Class getPropertyType(String name)：获取属性的类型。name 是 JavaBean属性的名称。返回属性的类型，如果属性不存在，则返回 null。
     * Object get(Object key)：获取 java bean 的属性值。
     * Object put(Object key, Object value)：设置 java bean 的属性值，key 必须是字符串类型，返回旧值(如果有)或null。
     */
    @Test
    public void testBeanMap() {
        User person = new User();
        person.setId(2002);
        person.setName("刘邦");

        //BeanMap create(Object bean)：bean 对象的属性需要提供 getter、setter 方法.
        BeanMap personBeanMap = BeanMap.create(person);
        //输出：{birthday=null, marry=null, name=刘邦, id=2002, salary=null}
        System.out.println(personBeanMap);
        personBeanMap.put("id", 3003);
        //输出：Person{id=3003, name='刘邦', marry=null, salary=null, birthday=null}
        System.out.println(person);
        person.setMarry(false);
        //输出：{birthday=null, marry=false, name=刘邦, id=3003, salary=null}
        System.out.println(personBeanMap);

        //class java.lang.Float
        System.out.println(personBeanMap.getPropertyType("salary"));
        //刘邦
        System.out.println(personBeanMap.get("name"));
    }

    /**
     * BeanMap create(Object bean) 方法底层也是使用的 Generator 方式。
     */
    @Test
    public void testGenerator() {
        User user = new User();
        BeanMap.Generator generator = new BeanMap.Generator();
        generator.setBean(user);
        BeanMap beanMap = generator.create();
        beanMap.put("id", 87854);
        beanMap.put("name", "项羽");
        beanMap.put("marry", false);
        beanMap.put("birthday", LocalDateTime.now());

        //{birthday=2022-01-15T10:14:46.541, marry=false, name=项羽, id=87854, salary=null}
        System.out.println(beanMap);
        //User{id=87854, name='项羽', marry=false, salary=null, birthday=2022-01-15T10:14:46.541}
        System.out.println(user);
    }

}
